package co.edu.usbcali.egrapico.logica;

import java.util.StringTokenizer;

/**
 * Clase para la traducci�n de la representaci�n de una
 * <Code>Restricci�n</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo
 * PiCO</I>.
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Constraint {

    //Variable para almacenar la restricci�n representada en c�lculo PiCO.
    String constraintPico = "";
    /**
     * Variable tokenizada para guardar los elementos de la restricci�n en
     * GraPiCO Textual.
     */
    StringTokenizer stConstraintGraPicoT;
    //Variable temporal para almacenar cada elemento de la restricci�n.
    String temp;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de clase
     * <Code>Constraint</Code>.<P> Separa la parte f�sica de los elementos que
     * conforman la
     * <Code>Restricci�n</Code>, usando el s�mbolo de sincronizaci�n "~".
     *
     * @param constraintGraPicoT Expresi�n equivalente a la representaci�n de
     * una
     * <Code>Restricci�n</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public Constraint(String constraintGraPicoT, String nameProcess) {
        nameCurrentProcess = nameProcess;
        stConstraintGraPicoT = new StringTokenizer(constraintGraPicoT, "~");
    }

    /**
     * Metodo generador de la traducci�n de una
     * <Code>Restricci�n</Code>.<P> Se forma la
     * <Code>Restricci�n</Code> en <I>C�lculo PiCO</I> concatenando sus
     * respectivos operadores y elementos.
     *
     * @return la
     * <Code>Restricci�n</Code> traducida a <I>C�lculo PiCO</I>
     */
    public String traslate() {
        int count = stConstraintGraPicoT.countTokens() - 1;
        String co = "";

        stConstraintGraPicoT.nextToken();
        while (stConstraintGraPicoT.hasMoreTokens()) {
            temp = stConstraintGraPicoT.nextToken();
            if (count != 1) {
                co = temp.substring(0, temp.indexOf("("));
                constraintPico += co;
            } else {
                co = temp.substring(0);
                constraintPico += co;
                String o = "ProcesoPPal.R," + co;
            }
            if ((Character.isLetter(co.charAt(0))) && !(co.equalsIgnoreCase("sender")) && !(co.equalsIgnoreCase("forward"))) {
                SemanticAnalizer.PutRequiredIdentifiers(nameCurrentProcess, co);
            }
            count--;
        }
        return constraintPico;
    }
}